跳到主要内容

8.3 使用回溯引用进行替换

到目前为止,我们在教程里面见到的正则表达式多都是用来搜索的。在今后的实际工作中也会发现,我们编写的绝大多数正则表达式可以用来搜索文本,但这并不是正则表达式的全部功能,正则表达式还可以用来完成各种复杂的替换操作。

简单的文本替换操作无须使用正则表达式就可以完成。比如说,如果只是把某个文档里的 CA 全部替换为 California 或把 MI 全部替换为 Michigan 的话,用正则表达式来完成这些替换就未免有点儿大材小用了。这句话的意思并不是说正则表达式不能用来执行这种替换,只是那么做没有什么实际价值。事实上,用普通的字符串处理函数来完成这种替换反而会更容易一些。

正则表达式更适用于复杂的替换,尤其是需要使用回溯引用的场合,那才能体现出正则表达式的真正威力。下面是一个我们在 第 5 章 里见过的例子:

https?://[\w./]+
在工具中查看
欢迎大家来到何方的个人小站 http://iamhefang.cn ,访问 https://iamhefang.cn 更加安全哦

这个模式可以把文本里面的链接给查找出来。

现在,假设我们需要把文本里面的链接全部转换为可点击的链接,你会怎么办?在 HTML 文档里,我们用 a 标签来表示链接。

<a href="https://iamhefang.cn">https://iamhefang.cn</a>

我们能不能用正则表达式把一个 URL 转换为这种可点击的标签呢?当然能,而且非常容易——我们可以使用回溯引用:

(https?://[\w./]+)
欢迎大家来到何方的个人小站 http://iamhefang.cn ,访问 https://iamhefang.cn 更加安全哦
<a href='$1'>$1</a>
在工具中查看
欢迎大家来到何方的个人小站 <a href='http://iamhefang.cn'>http://iamhefang.cn</a> ,访问 <a href='https://iamhefang.cn'>https://iamhefang.cn</a> 更加安全哦

替换操作需要用到两个正则表达式:一个用来给出搜索模式,另一个用来给出匹配文本的替换模式。回溯引用可以跨模式使用,在第一个模式里面被匹配的子表达式可以用的第二个模式里面。这里使用的模式 (https?://[\w./]+) 与我们以前使用的完全一样,但这次把它写成了一个子表达式。这样一来,被匹配到的文本就可以用在替换模式里了。<a href='$1'>$1</a> 使用了再次被匹配的子表达式: 一次在 href 属性里面,另一次是做为可点击文本。这样我们就把 URL 转换为了可点击的链接。

提示

正如上面这个例子里看到的那样,同一个子表达式可以被引用任意多次——只要在需要用到它的地方写出它的回溯引用就行了。

我们再来看一个例子。在一个用来保存用户信息的数据库里,电话号码被保存为 0371-12345678。现在我们需要把电话号码重新排版为 (0371)12345678。看下面这个例子:

(\d{3,4})-(\d{8})
0371-12345678
0396-12345679
010-12345670
($1)-$2
在工具中查看
(0371)-12345678
(0396)-12345679
(010)-12345670

和刚才一样,这里也使用了两个正则表达式。第一个被划分成了三个部分:第一个部分 (\d{3,4}) 匹配区号,第二个部分匹配连字符,第三个部分 (\d{8}) 匹配 8 位数电话号码。

提示

在对文本进行重新排版的时候,把文本分解成多个子表达式的做法往往非常有用,这可以让我们对文本的排版效果做出更精确的控制。

大小写转换

有些正则表达式实现允许我们使用下面表格里面的元字符对字母进行大小写转换。

元字符说明
\E结束 \L\U 转换
\l把下一个字母转换为小写
\L\L\E 之间的字符全部转换为小写
\u把下一个字母转换为大写
\U\U\E 之间的字符全部转换为大写

\l\u 只能把下一个字符(或子表达式)转换为小写或大写。\L\U 会把它后面的所有字符转换为小写或大写,直到遇上 \E 为止。

下面这个例子把 HTML 里面的所有 h1 标签全部转换为大写:

<h1>(.*?)</h1>
<body>
<h1>Welcome to my site</h1>
<h2>Regular Expression</h2>
正则表达式教程
</body>
<h1>\U$1</h1>
在工具中查看
<body>
<h1>WELCOME TO MY SITE</h1>
<h2>Regular Expression</h2>
正则表达式教程
</body>
提示

js 正则表达式引擎不支持使用元字符转换大小写,也就是说我们的在线工具不支持这个特性。在 VS Code 或 Sublime Text 等编辑器中是支持这个特性的。

该内容基于 《正则表达式必知必会》 二度创作
转载请遵守原作者相关协议并注明本页地址
https://iamhefang.cn/tutorials/正则表达式/第八章-回溯引用/8.3 使用回溯引用进行替换